home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / assembler / progasm1.lha / SORGENTI / LEZIONE3g.s < prev    next >
Text File  |  1994-10-30  |  10KB  |  254 lines

  1.  
  2. ; Lezione3g.s    SCORRIMENTO A DESTRA E SINISTRA TRAMITE IL WAIT del COPPER
  3.  
  4.  
  5.     SECTION    CiriCop,CODE
  6.  
  7. Inizio:
  8.     move.l    4.w,a6        ; Execbase in a6
  9.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  10.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  11.     jsr    -$198(a6)    ; OpenLibrary, routine della EXEC che apre
  12.                 ; le librerie, e da in uscita l'indirizzo
  13.                 ; di base di quella libreria da cui fare le
  14.                 ; distanze di indirizzamento (Offset)
  15.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  16.     move.l    d0,a6
  17.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist
  18.                 ; di sistema
  19.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  20.     move.w    d0,$dff088        ; Facciamo partire la COP
  21. mouse:
  22.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  23.     bne.s    mouse        ; Se non ancora, non andare avanti
  24.  
  25.     bsr.w    CopperDestSin    ; Routine di scorrimento destra/sinistra
  26.  
  27. Aspetta:
  28.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  29.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta la linea
  30.                 ; seguente, altrimenti MuoviCopper viene
  31.                 ; rieseguito
  32.  
  33.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  34.     bne.s    mouse        ; se no, torna a mouse:
  35.  
  36.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  37.     move.w    d0,$dff088        ; facciamo partire la cop
  38.  
  39.     move.l    4.w,a6
  40.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  41.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  42.                 ; (vanno aperte e chiuse le librerie!!!)
  43.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  44.     rts
  45.  
  46.  
  47. ; Questa routine anziche' agire sul primo byte a sinistra del wait, ossia
  48. ; quello che determina la posizione Y, facendo abbassare o alzare i wait con
  49. ; i colori seguenti, agisce sul secondo byte, quello delle X, generando uno
  50. ; spostamento a destra e a sinistra, regolato da 2 flags simili al SuGiu che
  51. ; abbiamo gia' visto, in questo caso si chiamano DestraFlag e SinistraFlag,
  52. ; dove sta il numero di volte che la routine VAIDESTRA o VAISINISTRA sono state
  53. ; eseguite, per limitare lo spostamento (ossia per decidere quanto andare 
  54. ; avanti prima di ritornare indietro): infatti ogni volta che la routine
  55. ; VAIDESTRA viene eseguita, la "barra grigia" avanza a destra, dunque dobbiamo
  56. ; farla fermare quando raggiunge il bordo opposto dello schermo, in questo caso
  57. ; quando e' stata eseguita 85 volte, dopodiche' la facciamo tornare indietro
  58. ; eseguendo altre 85 volte la routine VAISINISTRA, che la riporta alla
  59. ; posizione iniziale, e il ciclo riparte per continuare fino a che non premiamo
  60. ; il tasto del mouse.
  61. ; DA NOTARE CHE QUESTA ROUTINE O VA A VAIDESTRA O A VAISINISTRA, NON VENGONO
  62. ; ESEGUITE TUTTE E DUE: SE VIENE ESEGUITA VAIDESTRA POI SI TORNA DA QUELLA
  63. ; ROUTINE AL LOOP MOUSE:, LO STESSO PER VAISINISTRA. SE IL CICLO VAIDESTRA E
  64. ; VAISINISTRA E' FINITO (DOPO 2*85 FRAMES) SI TORNA AL CICLO "MOUSE" DALL'RTS
  65. ; DELLA ROUTINE CopperDESTSIN direttamente, dopo aver azzerato i 2 flag.
  66.  
  67.  
  68. CopperDESTSIN:
  69.     CMPI.W    #85,DestraFlag        ; VAIDESTRA eseguita 85 volte?
  70.     BNE.S    VAIDESTRA        ; se non ancora, rieseguila
  71.                     ; se e' stata eseguita gia' 85
  72.                     ; volte invece continua di seguito
  73.  
  74.     CMPI.W    #85,SinistraFlag    ; VAISINISTRA eseguita 85 volte?
  75.     BNE.S    VAISINISTRA        ; se non ancora, rieseguila
  76.  
  77.     CLR.W    DestraFlag    ; la routine VAISINISTRA e' stata eseguita
  78.     CLR.W    SinistraFlag    ; 85 volte, dunque a questo punto la barra
  79.                 ; grigia e' tornata indietro e il ciclo
  80.                 ; destra-sinistra e' finito, dunque azzeriamo
  81.                 ; i due flag e usciamo: al prossimo FRAME
  82.                 ; verra' rieseguita VAIDESTRA, dopo 85 frame
  83.                 ; vaisinistra 85 volte per 85 frame, eccetera.
  84.     RTS            ; TORNIAMO AL LOOP mouse
  85.  
  86.  
  87. VAIDESTRA:            ; questa routine sposta la barra verso DESTRA
  88.     addq.b    #2,CopBar    ; aggiungiamo 2 alla coordinata X del wait
  89.     addq.w    #1,DestraFlag    ; segnamo che abbiamo eseguito un'altra volta
  90.                 ; VAIDESTRA: in DestraFlag sta il numero
  91.                 ; di volte che abbiamo eseguito VAIDESTRA.
  92.     RTS            ; TORNIAMO AL LOOP mouse
  93.  
  94.  
  95. VAISINISTRA:            ; questa routine sposta la barra verso SINISTRA
  96.     subq.b    #2,CopBar    ; sottraiamo 2 alla coordinata X del wait
  97.     addq.w    #1,SinistraFlag ; Aggiungiamo 1 al numero di volte che e'
  98.                 ; stata eseguita VAISINISTRA.
  99.     RTS            ; TORNIAMO AL LOOP mouse
  100.  
  101.  
  102. DestraFlag:        ; In questa word viene tenuto il conto delle volte
  103.     dc.w    0    ; che e' stata eseguita VAIDESTRA
  104.  
  105. SinistraFlag:        ; In questa word viene tenuto il conto delle volte
  106.     dc.w    0    ; che e' stata eseguita VAISINISTRA
  107.  
  108.  
  109. ;    dati per salvare la copperlist di sistema.
  110.  
  111. GfxName:
  112.     dc.b    "graphics.library",0,0    
  113.  
  114. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  115.     dc.l    0    ; della graphics.library
  116.  
  117. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  118.     dc.l    0
  119.  
  120.     SECTION    GRAPHIC,DATA_C
  121.  
  122. COPPERLIST:
  123.     dc.w    $100,$200    ; BPLCON0
  124.     dc.w    $180,$000    ; COLOR0 - Inizio la cop col colore NERO
  125.  
  126.  
  127.     dc.w    $9007,$fffe    ; aspettiamo l'inizio della linea $90
  128.     dc.w    $180,$AAA    ; COLORE grigio
  129.  
  130. ; Qua abbiamo "SPEZZATO" la prima WORD del WAIT $9031 in 2 bytes per poter
  131. ; mettere una label (CopBar) ad indicare il secondo byte, ossia $31 (LA XX)
  132.  
  133.     dc.b    $90        ; POSIZIONE YY del WAIT (primo byte del WAIT)
  134. CopBar:
  135.     dc.b    $31        ; POSIZIONE XX del WAIT (Che cambiamo!!!)
  136.     dc.w    $fffe        ; wait - (sara' $9033,$FFFE - $9035,$FFFE....)
  137.  
  138.     dc.w    $180,$700    ; colore ROSSO, che partira' da posizioni
  139.                 ; sempre piu' verso destra, preceduto dal
  140.                 ; grigio che avanzera' di conseguenza.
  141.     dc.w    $9107,$fffe    ; wait che non cambiamo (Inizio linea $91)
  142.     dc.w    $180,$000    ; che serve a cambiare il colore in NERO
  143.                 ; alla linea successiva alla barretta.
  144.  
  145. ;    Come notate per la linea $90 servono 2 wait, uno per aspettare l'inizio
  146. ;    della linea (07) e uno, quello che modifichiamo (31), per definire in
  147. ;    che punto della linea cambiare colore, ossia passare dal giallo che e'
  148. ;    presente dalla posizione 07, al rosso che parte dopo la posizione
  149. ;    assunta dal wait che cambiamo.
  150. ;
  151.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  152.  
  153.     end
  154.  
  155. Bello Eh? Un effetto del genere viene usato spesso per fare gli equalizzatori
  156. a barre della musica. Lo spostamento orizzontale tramite il wait pero' ha
  157. dei limiti, infatti si possono dare solo valori dispari, e' per questo che
  158. di solito aspettiamo la linea yy07,$fffe e non yy08,$fffe. Di conseguenza si
  159. puo' scorrere a scatti di 2 pixel alla volta minimo: 7,9,$b,$d,$f,$11,$13....
  160. oppure ogni 4 pixel, oppure 8, mantenendo comunque il numero dispari, o si
  161. rischia di far esplodere l'Amiga. Nota: il massimo valore di XX e' $e1.
  162. Come modifiche quindi posso solo consigliarvi di far aggiungere 4 o 8 anziche'
  163. 2 per cambiare velocita', in questo caso ricordatevi anche di modificare il
  164. numero massimo di volte che eseguite la routine:
  165.  
  166.  
  167.     CMPI.W    #85/2,DestraFlag    ; 85 volte /2, ossia "diviso 2"
  168.     BNE.S    VAIDESTRA
  169.     CMPI.W    #85/2,SinistraFlag    ; 85/2, ossia 42 volte
  170.     BNE.S    VAISINISTRA        ; se non ancora, rieseguila
  171.     ....
  172.  
  173.     addq.b    #4,(a0)        ; aggiungiamo 4....
  174.     ....
  175.  
  176. Oppure per un addq.b #8,a0:
  177.  
  178.     CMPI.W    #85/4,DestraFlag    ; 85 volte /4, ossia 21
  179.  
  180.  
  181. se siete dei sadici provate a mettere un addq.b #1,(a0), creando dei wait XX
  182. anche pari.... nel migliore dei casi vi sparira' lo schermo a "flash" quando
  183. avviene la disparita' (infatti lo schermo si "spenge" quando un programmatore
  184. sprovveduto mette un wait con XX pari), oppure se si waita un valore strano
  185. alle volte si puo' generare proprio un blocco totale del computer, una specie
  186. di "GURU MEDITATION" del Copper. Fate dunque attenzione!!!!
  187. In particolare posso segnalarvi alcune coordinate pari particolari che
  188. anziche' limitarsi a far sparire lo schermo mandano proprio nel pallone il
  189. copper, costringendovi a resettare. (almeno sull'Amiga 1200 dove le ho provate)
  190.  
  191.     dc.w    $79DC,$FFFE    ; $dc = 220! pari e particolarmente ACIDO!
  192.                 ; fa impazzire il copper, ma non blocca
  193.                 ; il 68000, infatti potete continuare a
  194.                 ; lavorare "alla cieca", senza vedere nulla
  195.  
  196.     dc.w    $0100,$FFFE    ; questo invece BLOCCA tutto, non si puo'
  197.                 ; nemmeno uscire dal programma, bisogna
  198.                 ; resettare
  199.  
  200.     dc.w    $0300,$FFFE    ; Altro blocco totale...
  201.  
  202.  
  203. Questi "ERRORI" possono essere utili in caso vogliate proteggere dei programmi:
  204. nel caso il disco sia copiato male o la password non sia data giusta se
  205. si fa puntare immediatamente una copperlist con questi wait indiavolati
  206. si BLOCCA il computer peggio che con un guru del 68000, e ogni Action Replay
  207. o altre cartucce sono disabilitate e inutilizzabili. Oppure si potrebbero
  208. usare come autodistruzione, chissa' se mettendo tanti errori in fila si
  209. puo' danneggiare il computer FISICAMENTE???
  210.  
  211. NOTA: Potete ottenere un effetto come questo modificando l'esempio Lezione3c.s
  212.       che sposta in basso un wait semplicemente modificando la routine:
  213.  
  214.  
  215. MuoviCopper:
  216.     cmpi.b    #$fc,BARRA    ; siamo arrivati alla linea $fc?
  217.     beq.s    Finito        ; se si, siamo in fondo e non continuiamo
  218.     addq.b    #1,BARRA    ; WAIT 1 cambiato, la barra scende di 1 linea
  219. Finito:
  220.     rts
  221.  
  222. In questo modo, facendogli cambiare la posizione XX anziche' YY (BARRA+1), e
  223. facendolo avanzare di 2 anziche' di 1 alla volta (numeri DISPARI!), senza
  224. dimenticarsi che il valore massimo e' $e1, da sostituire al $fc
  225.  
  226. MuoviCopper:
  227.     cmpi.b    #$e1,BARRA+1    ; siamo arrivati alla colonna $fc?
  228.     beq.s    Finito        ; se si, siamo in fondo e non continuiamo
  229.     addq.b    #2,BARRA+1    ; WAIT 1 cambiato, la barra avanza di 2
  230. Finito:
  231.     rts
  232.  
  233. Vedrete la prima linea spostarsi verso destra anziche' abbasarsi. Per
  234. evidenziare l'effetto potete "ISOLARE" la linea $79 facendo diventare blu
  235. scuro lo schermo dalla linea seguente, ossia la $7a aggiungendo queste 2
  236. linee prima della fine della copperlist:
  237.  
  238.     dc.w    $7a07,$FFFE    ; aspetto la linea $79
  239.     dc.w    $180,$004    ; inizio la zona rossa: rosso a 6
  240.  
  241. Nella lezione3g la difficolta' forse risiede piu' nella routine che fa andare
  242. avanti e indietro la barra piuttosto che nel fatto che operiamo sulla posizione
  243. XX anziche' su quella YY. In effetti le ultime lezioni che avete affrontato
  244. hanno delle routines 68000 non troppo semplici, che sono pero' indispensabili
  245. per generare gli effetti col copper, dunque per capire il copper stesso; nella
  246. Lezione 4 invece le routines 68000 saranno anche piu' semplici di quelle
  247. di questa lezione 3, dovendo spiegare come visualizzare immagini statiche.
  248. Se non riuscite a comprendere a fondo il funzionamento delle routine delle
  249. ultime lezioni quindi procedete con la Lezione4, e riprovate a comprenderle
  250. quando vi troverete piu' avanti nel corso, momento in cui avrete certamente
  251. piu' familiarita' con le routines. La Lezione3h.s e' un ampliamento della
  252. Lezione3g.s.
  253.  
  254.